package config

import (
	"context"
	"strings"

	"github.com/glennliao/apijson-go/config"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/util/gconv"
)

// 设置访问/请求自定义表名
var (
	B表名访问  = "_access"
	B表名请求  = "_request"
	T提供者名称 = "db"
)

// 获取请求配置列表函数
func Q获取请求配置列表(ctx context.Context) []config.Q请求配置 {
	// 定义一个空的请求配置列表
	var 请求列表 []config.Q请求配置
	// 从数据库中获取请求配置列表，按照版本号升序排列
	错误 := g.DB().Model(B表名请求).OrderAsc("version").Scan(&请求列表)
	if 错误 != nil {
		panic(错误)
	}

	for 索引, 项 := range 请求列表 {
		项 := 项

		if 项.J结构定义 == nil {
			项.J结构定义 = make(map[string]*config.J结构定义)
		}

		// 提供者处理
		// if strings.ToLower(标签) != 标签 {
		//	// 本身大写, 如果没有外层, 则套一层
		//	if _, 存在 := 项.结构定义[标签]; !存在 {
		//		项.结构定义 = map[string]any{
		//			标签: 项.结构定义,
		//		}
		//	}
		// }

		for 键, 值 := range 项.J结构定义 {
			结构定义 := config.J结构定义{}
			错误 := gconv.Scan(值, &结构定义)
			if 错误 != nil {
				panic(错误)
			}

			if 结构定义.B必填字段 != nil {
				结构定义.B必填字段 = strings.Split(结构定义.B必填字段[0], ",")
			}
			if 结构定义.J拒绝字段 != nil {
				结构定义.J拒绝字段 = strings.Split(结构定义.J拒绝字段[0], ",")
			}

			项.J结构定义[键] = &结构定义
		}

		if len(项.Z执行队列) > 0 {
			项.Z执行队列 = strings.Split(项.Z执行队列[0], ",")
		}

		请求列表[索引] = 项
	}

	return 请求列表
}

func S数据库元数据提供者(ctx context.Context) []config.B表结构 {
	var 表结构列表 []config.B表结构

	数据库 := g.DB()
	表名列表, 错误 := 数据库.Tables(ctx)
	if 错误 != nil {
		panic(错误)
	}

	for _, 表名 := range 表名列表 {
		字段列表, 错误 := 数据库.TableFields(ctx, 表名)
		if 错误 != nil {
			panic(错误)
		}

		var 字段结构列表 []config.B表字段结构
		for 字段名 := range 字段列表 {
			字段结构列表 = append(字段结构列表, config.B表字段结构{M名称: 字段名})
		}

		表结构列表 = append(表结构列表, config.B表结构{
			M名称:   表名,
			Z字段列表: 字段结构列表,
		})
	}

	return 表结构列表
}

func F访问列表数据库提供者(ctx context.Context) []config.F访问配置结构 {
	// 访问配置
	var 访问列表 []config.F访问配置结构

	数据库 := g.DB()

	错误 := 数据库.Model(B表名访问).Scan(&访问列表)
	if 错误 != nil {
		panic(错误)
	}

	for _, 访问配置 := range 访问列表 {
		if len(访问配置.H获取权限) == 1 {
			访问配置.H获取权限 = strings.Split(访问配置.H获取权限[0], ",")
		}
		if len(访问配置.T头部权限) == 1 {
			访问配置.T头部权限 = strings.Split(访问配置.T头部权限[0], ",")
		}
		if len(访问配置.P批量获取权限) == 1 {
			访问配置.P批量获取权限 = strings.Split(访问配置.P批量获取权限[0], ",")
		}
		if len(访问配置.P批量头部权限) == 1 {
			访问配置.P批量头部权限 = strings.Split(访问配置.P批量头部权限[0], ",")
		}
		if len(访问配置.T提交权限) == 1 {
			访问配置.T提交权限 = strings.Split(访问配置.T提交权限[0], ",")
		}
		if len(访问配置.G更新权限) == 1 {
			访问配置.G更新权限 = strings.Split(访问配置.G更新权限[0], ",")
		}
		if len(访问配置.S删除权限) == 1 {
			访问配置.S删除权限 = strings.Split(访问配置.S删除权限[0], ",")
		}

		访问列表 = append(访问列表, 访问配置)
	}

	return 访问列表
}
